// Package exception
// Title  		runtime.exception.common.go
// Description  统一返回值包
// Author  		alittlexincan@163.com  			2024/07/22 11:36
// update  		alittlexincan@163.com  			2024/07/22 11:36
package exception

import (
	"github.com/pkg/errors"
)

type RuntimeError interface {
	error

	Code() int

	Message() string

	Unwrap() error
}

// RuntimeException
// Title    		RuntimeException
// Description   	运行时状态结构体
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
type RuntimeException struct {

	// code 状态码
	code int

	// message 状态信息
	message string

	// wrap 原始错误, 用于内部日志记录
	wrap error
}

// NewRuntimeException
// Title    		NewRuntimeException
// Description   	创建运行时状态结构体
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
// Param    		code 				int						业务状态码
// Param    		message 			string					业务状态信息
// Return 			*RuntimeException							返回运行时状态结构体
func NewRuntimeException(code int, message string) *RuntimeException {
	return &RuntimeException{
		code:    code,
		message: message,
	}
}

// WithError
// Title    		WithError
// Description   	设置运行时状态结构体的原始错误
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
// Param    		err 				error					原始错我
// Return 			*RuntimeException							返回运行时状态结构体
func (runtime *RuntimeException) WithError(err error) *RuntimeException {
	runtime.wrap = errors.WithStack(err)
	return runtime
}

// Error
// Title    		Error
// Description   	实现并重写语言内置的error
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
// Return    		string										返回状态信息
func (runtime *RuntimeException) Error() string {
	if runtime.wrap != nil {
		return runtime.message + ": " + runtime.wrap.Error()
	}
	return runtime.message
}

func (runtime *RuntimeException) Code() int {
	return runtime.code
}

func (runtime *RuntimeException) Message() string {
	return runtime.message
}

func (runtime *RuntimeException) Unwrap() error {
	return runtime.wrap
}
